/**
描述
  原理：ip地址的每段可以看成是一个0-255的整数，把每段拆分成一个二进制形式组合起来，然后把这个二进制数转变成
  一个长整数。
  举例：一个ip地址为10.0.3.193
  每段数字             相对应的二进制数
  10                   00001010
  0                    00000000
  3                    00000011
  193                  11000001

  组合起来即为：00001010 00000000 00000011 11000001,转换为10进制数就是：167773121，即该IP地址转换后的数字就是它了。

  数据范围：保证输入的是合法的 IP 序列

  输入描述：
  输入 
  1 输入IP地址
  2 输入10进制型的IP地址

  输出描述：
  输出
  1 输出转换成10进制的IP地址
  2 输出转换后的IP地址

  输入：
    10.0.3.193
    167969729
  输出：
    167773121
    10.3.3.193
*/
const readline = require('readline')
const rl = readline.createInterface({
  input:process.stdin,
  output:process.stdout
})


function transform(inputStr) {
  // 判断是否 . 分割的字符串 为正确的 ip 地址
  if (inputStr.includes('.')) {
    let inputArr = inputStr.split('.')
    let tempStr = ''
    inputArr = inputArr.map((ipItem) => {
      tempStr = parseInt(ipItem)
      tempStr = tempStr.toString(2)
      tempStr = tempStr.padStart(8, 0)
      return tempStr
    })
    inputStr = inputArr.join('')
    console.log(parseInt(inputStr, 2))
  } else {
    // 如果是正常10进制 转成ip
    inputStr = parseInt(inputStr).toString(2)
    // 8 位截取一段 转数组
    let inputArr = inputStr.split('').reverse()
    let inputArr2 = []
    let tempNum
    while(inputArr.length) {
      tempNum = inputArr.splice(0, 8)
      // 通过二进制转为 10 进制
      tempNum = tempNum.reverse().join('')
      tempNum = parseInt(tempNum, 2)
      inputArr2.push(tempNum)
    }
    console.log(inputArr2.reverse().join('.'))
  }
}

// 本地测试
// const inputStr = "167969729"
// transform(inputStr)

// 提交测试
rl.on('line', (line) => {
  if (line) {
    // 处理接收
    transform(line)
  }
})